// 文件路径: dbms/common/QueryResult.java
package com.dbms.common;

import java.io.Serializable;
import java.util.Collections;
import java.util.List;

/**
 * 封装一次SQL执行的完整结果。
 * 这个类是数据库核心逻辑与上层应用（如CLI、GUI或网络服务）之间交互的数据传输对象（DTO）。
 * 它实现了 Serializable 接口，使其可以被序列化并通过网络传输。
 */
public class QueryResult implements Serializable {

    // 标记操作是否成功
    public final boolean isSuccess;
    // 包含操作结果的消息，成功时是摘要信息，失败时是错误详情
    public final String message;
    // 对于 SELECT 查询，这里存储结果集的元数据（列名、类型等）
    public final Schema schema;
    // 对于 SELECT 查询，这里存储所有返回的数据行（元组）
    public final List<Tuple> tuples;
    // 对于 INSERT, UPDATE, DELETE 操作，这里存储受影响的行数
    public final int rowsAffected;

    /**
     * 构造函数 - 用于成功的 SELECT 查询。
     * @param schema 查询结果的 Schema。
     * @param tuples 查询结果的数据元组列表。
     */
    public QueryResult(Schema schema, List<Tuple> tuples) {
        this.isSuccess = true;
        this.schema = schema;
        this.tuples = tuples;
        this.rowsAffected = tuples.size(); // 对于SELECT，受影响行数即为返回的元组数
        this.message = "查询返回了 " + this.rowsAffected + " 条元组。";
    }

    /**
     * 构造函数 - 用于成功的 DML (Data Manipulation Language) 如 INSERT/UPDATE/DELETE
     * 或 DDL (Data Definition Language) 如 CREATE TABLE 等操作。
     * @param rowsAffected 受影响的行数。
     * @param message      成功的提示消息。
     */
    public QueryResult(int rowsAffected, String message) {
        this.isSuccess = true;
        this.rowsAffected = rowsAffected;
        this.message = message;
        this.schema = null; // 非SELECT操作没有结果集Schema
        this.tuples = Collections.emptyList(); // 非SELECT操作没有返回的元组
    }

    /**
     * 构造函数 - 用于任何失败的操作。
     * @param errorMessage 描述错误的详细信息。
     */
    public QueryResult(String errorMessage) {
        this.isSuccess = false;
        this.message = errorMessage;
        this.schema = null;
        this.tuples = Collections.emptyList();
        this.rowsAffected = 0; // 失败操作，受影响行数为0
    }
}